﻿using System;
using System.Collections.Generic;
using System.Configuration;
using Logger;
using System.Data;
using System.Reflection;
using ClickLand.CorporacionPlaza.AccesoDato.Contratos;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using MySql.Data.MySqlClient;
using NHibernate;

namespace ClickLand.CorporacionPlaza.AccesoDato.Implementacion.NHibernateMySql
{
    /// <summary> Clase que implementa el contrato IDaoEstablecimiento  </summary>
    public class DaoEstablecimientoNHibernateMySql : DaoBase<Establecimiento>, IDaoEstablecimiento 
    {
        /// <summary> Metodo que consulta los establecimientos con parametros indicados </summary>
        /// <param name="establecimiento">parametros para la busqueda</param>
        /// <returns>Lista de establecimientos que concuerden con los parametros</returns>
        public List<Establecimiento> Consultar(Establecimiento establecimiento)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            List<Establecimiento> listaEntidad = null;

            try
            {
                IQuery query = Session.CreateQuery(ConsultasHQL.ConsultaEstablecimiento)
                    .SetParameter("lugar", string.Format("%{0}%",string.IsNullOrEmpty(establecimiento.Lugar) ? null : establecimiento.Lugar))
                    .SetParameter("tipo", establecimiento.Tipo.Id );

                listaEntidad = (List<Establecimiento>)query.List<Establecimiento>();
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.InfoHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            finally
            {
                Session.Close();
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }


        /// <summary> Metodo que consulta los establecimientos libre dentro de un rango de fecha </summary>
        /// <param name="inicio"> </param>
        /// <param name="fechaInicio">fecha de inicio del rango de busqueda</param>
        /// <returns>Lista de establecimientos</returns>
        public IList<Establecimiento> ConsultarEstablecimientosLibres(DateTime inicio, DateTime fin)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            IList<Establecimiento> listaEntidad = new List<Establecimiento>();

            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ConsultarEstablecimientosLibre";
                comando.Connection.Open();
                comando.Parameters.AddWithValue("@FechaInicio", inicio);
                comando.Parameters.AddWithValue("@FechaFin", fin);

                comando.Parameters["@FechaInicio"].Direction = ParameterDirection.Input;
                comando.Parameters["@FechaFin"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    var obj = new Establecimiento();
                    obj.Id = reader.GetInt64(0);
                    obj.Numero = (string) reader[1];
                    obj.Lugar = (string)reader[2];
                    obj.Precio = reader.GetFloat(3);
                    obj.Precio = reader.GetInt32(5);
                    obj.Tipo = new TipoEstablecimiento();
                    obj.Tipo.Id = reader.GetInt64(6);
                    obj.Tipo.Descripcion = (string) reader[7];
                    listaEntidad.Add(obj);
                }

                #region Instrumentacion Salida
                if (Log.InfoHabilitado)
                    Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
                #endregion
                comando.Connection.Close();
                return listaEntidad;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.InfoHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            finally
            {
                Session.Close();
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }
    }
}
